package cn.lds.j368.dsbank.dto;

import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class RespDTO<T> implements Serializable {
	private static final long serialVersionUID = 1L;
	private final static Logger logger = LoggerFactory.getLogger(RespDTO.class);
	/**
	 * 响应业务状态码
	 */
	private Integer code;
	/**
	 * 是否正常
	 */
	private Boolean flag;
	/**
	 * 响应信息
	 */
	private String message;
	/**
	 * 响应中的数据
	 */
	private T data;
	
	/**
	 * 构造方法封装相应状态吗、信息、对象、及是否正常
	 * @param code
	 * @param message
	 * @param data
	 */
	public RespDTO(Integer code, String message, T data) {
		this.code = code;
		this.message = message;
		this.data = data;
		this.flag = code == ResultEnum.SUCCESS.getCode() ? true: false;
	}
	
	/**
	 * 响应成功方法，封装状态码、信息
	 * @return
	 */
	public static RespDTO buildSuccess() {
		return new RespDTO(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getDesc(),
				null);
	}
	
	/**
	 * 响应成功方法，封装状态码、信息和数据
	 * @param data
	 * @return
	 */
	public static RespDTO buildSuccess(Object data) {
		return new RespDTO(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getDesc(),
				data);
	}
	
	/**
	 * 响应成功方法，封装信息和数据
	 * @param message
	 * @param data
	 * @return
	 */
	public static RespDTO buildSuccess(String message, Object data) {
		return new RespDTO(ResultEnum.SUCCESS.getCode(), message, data);
	}
	
	/**
	 * 响应失败方法，封装状态码、信息
	 * @param message
	 * @return
	 */
	public static RespDTO buildError(String message) {
		logger.debug("返回错误：code={}, message={}", ResultEnum.ERROR.getCode(), message);
		return new RespDTO(ResultEnum.ERROR.getCode(), message, null);
	}
	
	/**
	 * 封装自定义的状态码和信息
	 * @param code
	 * @param message
	 * @return
	 */
	public static RespDTO build(int code, String message) {
		logger.error("返回结果：code={}, message={}", code, message);
		return new RespDTO(code, message, null);
	}
	
	/**
	 * 根据枚举对象封装相应结果
	 * @param resultEnum
	 * @return
	 */
	public static RespDTO build(ResultEnum resultEnum) {
		logger.debug("返回结果：code={}, message={}", resultEnum.getCode(),
				resultEnum.getDesc());
		return new RespDTO(resultEnum.getCode(), resultEnum.getDesc(), null);
	}
	
	/**
	 * 使用FastJson将对象转换为字符串
	 * @return
	 */
	public String toString() {
		return JSON.toJSONString(this);

	}
}